Skip to content

feat(plugins): Java Support 独立分发、迁移与按需安装 - #1483

Merged
xiaoyumuxi merged 4 commits into
1lck:previewfrom
Mucheen:codex/java-support-download-foundation
Oct 28, 2026
Merged

xiaoyumuxi merged 4 commits into
1lck:previewfrom
Mucheen:codex/java-support-download-foundation

Conversation

@Mucheen

@Mucheen Mucheen commented Oct 25, 2026 •

Copy link
Copy Markdown
Collaborator

Java Support 已经是声明式插件,但资源仍随应用下载,外部副本也不能沿用宿主签名。本 PR 在同一插件 ID 下补齐可信独立发布、老用户切换和按需安装,并让应用在完整双架构官方索引上架后省去内置 Java 资源。当前 releaseEnabled: false 且真实索引为空,默认构建继续保留过渡包。

功能与行为

  • 新增 packageTrust: 1 契约、schema 和 fixture,旧宿主在下载前过滤新版。下载副本要求 publisherPackage;可选 bundledSignatureRequirement: sameTeamAsHost 仅适用于官方目录固定、确实位于宿主 app 内的 bundled 来源。任意来源只要存在签名文档都必须验证,来源伪造不能借用内置例外。
  • Java Support 版本为 1.1.0,上游 JDT、JDK、Lombok、Java Debug/Test 组合不变。安装通过 Core 启动计划验证目标架构运行时、入口及固定资源,拒绝损坏、无签名或缺少架构运行时的包。
  • 内置默认启用的模块在成功安装下载版后保存该选择;显式禁用、插件设置、项目 JDK 和运行配置保持原值;新增模块不继承旧包未拥有的启用状态。重启后同 ID 只选择一个版本;失败安装继续保留有效内置来源。旧卸载标记不再清理已重新安装版本的状态;卸载下载更新也抑制内置副本,避免重启后重新启用。
  • 过渡期内置包接入官方市场来源,同版本也可明确切换为独立包,已卸载的副本可通过安装恢复。直接跳过过渡版升级时,无包保持未安装,不自动下载;打开 Java 文件或项目显示每窗口会话一次的市场/磁盘包提示,新建项目页提供 Java、Maven 和 Spring 模板安装入口。新增文案进入共享翻译源并生成中英文原生资源。
  • bundledUntilPublishedVersion: 1.1.0 控制默认包的退出条件。构建要求官方索引的仓库、API、能力与双架构 URL、平台和哈希完整且唯一,才跳过 Java 组装及 JDT/JDK 准备;缺项保留过渡包,损坏输入中止构建。后续兼容下载版本可继续满足门槛。打包判断和嵌入使用同一索引,支持只读的 LITHE_OFFICIAL_PLUGIN_INDEX / --marketplace-index 构建输入;临时 fixture 不参与发布或工作树复用,运行时不改写发行目录。
  • ARM64、Intel 官方 ZIP 各有独立 SHA-256。发布计划保存真实 API/能力,从不可变 tag 读取历史配置,全部架构验证后一次发布和上架,拒绝部分版本;修改已发布插件输入要求升版。standalone release 要求发布私钥,应用的 --bundled-only 使用宿主签名;开发包只允许 debug 显式生成。
  • 同步架构笔记、提案、CI 构建说明、资源复用排除路由与测试、Java 功能矩阵。CI 对默认/精简 universal app 分别验证资源、架构、签名和 DMG,发布规划包含分发决策回归。

本次 CI 与基线修复

  • 合并最新 preview(0beb43c93),解决翻译资源和包管理器冲突,并包含 WebView 摄像头/麦克风权限覆盖清单的修复,消除原 Swift CI 的失败。
  • 安装保留统一的实时激活流程;成功存储后迁移旧内置模块的启用选择。普通、市场和磁盘三种入口分别回归默认启用、显式禁用、设置保留、重启和内置包内容不变;Java 继续遵循宿主集成的重启边界。
  • Java 缺包通知与市场按钮改用统一 L10n 接口,跟随应用语言;同步迁移决策笔记和功能矩阵验证步骤。
  • 同步新连接契约后,为实时激活测试的连接选择器补齐 attach 绑定。原生图标测试复用现有 ICC 取色工具;搜索交互测试明确区分筛选面板与编辑对话框,并等待原生窗口关闭再发送下一次输入,保持像素、状态、性能及超时断言。

本轮 Review 修复

  • 缺包判断读取完整安装快照,卸载并重启后保留的内置 .removed 副本不再被当作已安装。Java 文件、Maven/Gradle 项目可再次提示主动恢复;已安装(含禁用)、暂存更新和仍待卸载重启的副本保持原管理流程,每窗口会话一次的提示规则保留。
  • 使用真实 Core/签名校验/包存储执行安装→卸载→启动准备→重新扫描,验证移除快照仍允许 Java 文件与 Maven 项目提示;状态矩阵覆盖四种安装状态、启用/禁用及等待重启的区别。
  • 补充深浅主题的新建项目模板入口与 Java 缺包通知截图,原生按钮测试核对只有点击后才发出市场搜索;不自动安装、启用、生成项目或执行工具。本轮不调整界面布局。
场景 浅色 深色
Java 缺包通知(展开) 浅色通知 深色通知
新建项目安装入口 浅色入口 深色入口

截图来自实际 SwiftUI/AppKit 视图与受控目录/动作,复验方式见 docs/assets/java-installation-guidance/README.md。它们不代替真实市场下载、完整发行包、Intel 真机和 Windows 验收。

本轮修复验证

  • Swift 6.3.3 标准稳定性 harness:75 项测试、5 组套件全部通过,实际执行 15.294 秒;覆盖签名/存储迁移、状态提示、市场状态、新建项目和通知。卸载更新并重启的回归、8 组安装/启用状态及待重启区别通过。新增原生视图测试各覆盖深浅主题,按钮点击只记录明确的市场搜索,不启动下载/安装或工具。
  • 新建项目入口测试两主题合计 1.869 秒,通知展开与动作测试 1.421 秒,状态矩阵 1.415 秒;均低于原有单测试 15 秒上限。HTML/JSON/JUnit 在本地 pr1483-review-macos.*,没有放宽断言、计时预算或检查脚本。
  • 首轮在执行测试前因冷编译达到 harness 的 600 秒整轮上限;随后将编译与测试分开,完成编译后以 --skip-build 运行同一计时入口并通过。编译日志保留在本地工件中,不将编译超时说成测试断言失败。
  • 共享契约、9441 条中英文生成检查、应用语言、服务/Windows 边界、运行时包只读、164 篇 Agent Notes、稳定性、功能矩阵及相对实际 PR base/head 的矩阵门禁通过。本轮没有修改 Rust、SDK 或发行流程,没有重跑此前完整 Core/应用打包/Windows 实机验证。

此前本次 CI 与基线修复的验证

  • Swift 6.3.3:完整 macOS 套件 3566 项、416 个 suite 通过,计时报告记录 3546 个完成记录;断言、套件截止时间和单项性能预算全部通过。三种安装来源的 6 组启用/禁用迁移共 460 ms,原 WebView 权限覆盖用例 874 ms;原生图标回归 71 ms,搜索筛选/编辑往返 9.564 s。
  • Rust Core:1283 项单元测试、2 项路径往返、25 项 push 目标、5 项 watch 上下文集成测试全部通过(单独运行,test-threads=2)。
  • Swift/C ABI 桥接、46 个 LSP provider、链接符号、12 项原生 Git/AskPass 集成和 9 项 Swift Git Console/Maven 桥接测试通过。首轮应用 AskPass 等待达到 5 秒截止时间,单独验证两种入口和整组复核均通过;保留原截止时间。
  • 官方分发、发布规划、工作树资源复用和共享翻译合计 72 项通过。翻译、共享契约、服务/Windows 边界、运行时 bundle 只读、Rust 注释和格式、Agent Notes、功能矩阵及工作流 actionlint 1.7.12 均通过。
  • 首轮在并行编译负载下出现 Git 性能、翻译子进程超时和 rebase 状态失败;串行分离编译后复核,未增加超时或性能阈值。最终完整 macOS 结果以上述通过报告为准。
  • 本次未重跑 universal 应用/DMG 构建或 Windows 原生运行,前一阶段的打包证据见下;新的 CI 结果在推送后单独确认。

此前阶段验证

  • macOS 计时入口:迁移/签名、包管理器、包存储、市场状态和项目生成器 95 项通过。迁移与签名用例最慢 278 ms,HTML/JUnit 位于本地 .artifacts/test-stability/。
  • 官方发布和默认分发 13 项、资源复用 24 项通过并记录 JUnit/HTML;共享翻译 35 项通过。
  • 共享契约、测试稳定性、服务/Windows 边界、运行时 bundle 只读、Java 语义所有权、Agent Notes、功能矩阵及相对实际 PR 基线的变更门禁通过;actionlint 1.7.12 和 shell 语法检查通过。
  • 默认及 --slim universal 应用与 DMG 均实际构建通过,ARM64/Intel 架构、资源清单、应用签名和磁盘镜像检查通过。完整 fixture 索引下,缺少 JDT/JDK 构建输入仍可产出无 Java 副本的应用;空真实索引下,过渡包完整保留。临时应用和 DMG 已清理。
  • 可信安装基础提交 00ab21e22 已通过 Rust Core 1207 项及集成测试、Swift 信任安装等 121 项和 Java 消费者 180 项、C ABI/桥接;本次迁移提交 6ab867aeb 未进一步修改 Rust 实现或契约,macOS 受影响模块另按上述 95 项回归验证。
  • 本地组装 ARM64/Intel 真实 Java 开发包,验证 JDK 原生签名、JDK 启动、归档解压字节一致性及安装资源哈希不变。ARM64 原始 415,169,923 字节(ZIP 261,637,060),Intel 原始 388,833,304 字节(ZIP 255,769,180);不作为正式发布资产。

发布边界

没有创建插件线上 Release、真实市场索引或使用正式发布私钥。默认应用当前仍含 Java,必须先发行支持新信任能力的宿主,再验证正式签名双架构包和真实市场安装,最后合并真实索引触发精简。fixture 索引只能证明构建路径,不能替代真实上架、Intel 真机及完整 Java 产品工作流;矩阵保持运行验收 pending。Windows 独立分发尚未实现。

插件契约合并后,需在 lithe-plugin-docs 运行 node scripts/contract.mjs sync --revision <合并后的 preview commit> 并提交完整副本。本 PR 未修改插件后端 wire 协议或 SDK。

@ghfind-review ghfind-review Bot added the review: medium ghfind author score; see https://ghfind.com label Oct 25, 2026
@xiaoyumuxi

Copy link
Copy Markdown
Collaborator

感觉吧,其实也可以拆成插件,但是好像工程量有点大,后面再下载也是可以的吧(但是下载大小可能有点大)

@Mucheen Mucheen changed the title feat(plugins): Java Support 可信安装与双架构独立发布基础 feat(plugins): Java Support 独立分发、迁移与按需安装 Oct 25, 2026
@Mucheen
Mucheen marked this pull request as ready for review October 25, 2026 06:45
@lithe-code-review

lithe-code-review Bot commented Oct 25, 2026 •

Copy link
Copy Markdown

Lithe Review

结论: ❓ 审查未完成

任务: 343

审查状态:已由服务器取消

可以重新评论 @lithe review 召唤。维护者可通过任务编号查看服务器日志。

@Mucheen
Mucheen marked this pull request as draft October 25, 2026 06:54
@xiaoyumuxi

xiaoyumuxi commented Oct 25, 2026 •

Copy link
Copy Markdown
Collaborator

#1498 你看看这个issue看看能不能全部从rust核心移出来呗,最近在清理重构代码,很多Java的还是用的之前的入口没有走统一的逻辑

@Mucheen

Mucheen commented Oct 25, 2026

Copy link
Copy Markdown
Collaborator Author

#1498 你看看这个issue看看能不能全部从rust核心移出来呗,最近在清理重构代码,很多Java的还是用的之前的入口没有走统一的逻辑

ok

@Mucheen

Mucheen commented Oct 25, 2026 •

Copy link
Copy Markdown
Collaborator Author

#1498 你看看这个issue看看能不能全部从rust核心移出来呗,最近在清理重构代码,很多Java的还是用的之前的入口没有走统一的逻辑

@xiaoyumuxi 是1495这个issue吗

@xiaoyumuxi

Copy link
Copy Markdown
Collaborator

#1498 你看看这个issue看看能不能全部从rust核心移出来呗,最近在清理重构代码,很多Java的还是用的之前的入口没有走统一的逻辑

@xiaoyumuxi 是1495这个issue吗

是的是的

@Mucheen

Mucheen commented Oct 26, 2026

Copy link
Copy Markdown
Collaborator Author

#1498 你看看这个issue看看能不能全部从rust核心移出来呗,最近在清理重构代码,很多Java的还是用的之前的入口没有走统一的逻辑

@xiaoyumuxi 是1495这个issue吗

是的是的

没问题

Preserve bundled enablement migration through the unified live install flow. Cover signed disk imports and marketplace installs, use shared localization, and repair connection, color-profile, and native popup lifecycle regressions.
@Mucheen
Mucheen marked this pull request as ready for review October 28, 2026 02:00
@lithe-code-review

lithe-code-review Bot commented Oct 28, 2026 •

Copy link
Copy Markdown

Lithe Review

结论: ⚠️ 有建议
范围: preview ← codex/java-support-download-foundation · head: e5d5a26

Findings

  1. [P2] 已移除的 Java 包会跳过缺包提示
    macos/Sources/Lithe/Models/AppModel/AppModel+JavaPlugin.swift:11

    • 实际影响:用户卸载 Java Support 并重启后,打开 Java 文件或项目不会收到本次新增的安装提示,需要手动进入插件市场恢复。
    • 触发条件:包管理器仍保留状态为 .removed 的内置副本快照;该调用把所有快照 ID 都视为已安装,导致 JavaPluginTransition.shouldSuggest 返回 false。
    • 复现步骤:卸载 Java Support、重启 Lithe,再打开 .java 文件或含 pom.xml 的项目;MacPluginPackageStore 会以 .removed 状态返回内置副本,MacPluginManager.snapshots 仍包含该快照。
    • 来源:本次引入。新增提示逻辑以快照 ID 判断是否缺包,但没有排除已移除状态;功能矩阵仍承诺卸载重启后打开 Java 文件会提示恢复。

Scope Check

  • 关联 Issue 或需求是否完成:未找到可验证的关联 Issue;按 PR 描述和变更核对。独立分发基础、迁移入口与构建门槛已实现;正式发布、真实市场索引和 Windows 独立分发尚未完成。
  • 已完成范围:来源限定的插件信任、同 ID 安装迁移、双架构发布规划、基于完整索引的精简构建门槛,以及 Java 缺包和新建项目入口。
  • 未完成范围:真实签名包发布与市场安装、Intel 真机及完整 Java 产品工作流仍待验收;PR 说明 Windows 独立分发尚未实现。
  • 是否复用了已有上游能力,或对自研边界给出充分证据:继续使用现有 JDT LS/JDK 插件包与宿主集成,没有新增并行语言引擎;本次主要增加分发、信任和产品编排。
  • 每个 Finding 是否由本次变更引入或加剧:是,新增的缺包判断把 .removed 快照当作仍已安装。
  • 是否属于本次变更职责范围:是,缺包提示是本次 Java 按需安装流程的一部分。

Suggestions

  1. 缺包判断应忽略 .removed 状态,同时保留对已安装或仍在等待卸载重启的包的抑制;增加“卸载并重启后打开 Java 文件会提示”的回归覆盖。
  2. PR 描述或评论需补充新建项目入口与 Java 缺包通知的截图;未提供截图,视觉效果尚未验证。

Summary

插件信任、安装状态迁移、发行资源只读边界和双架构发布流程整体与仓库约束一致。当前有一项 P2 用户流程建议;未发现需要阻塞合并的问题。

Verification

  • 实际检查:给定 base...head 的插件发布脚本与工作流、Java 包管理器和信任验证、迁移与提示调用链、共享契约、i18n、功能矩阵、资源复用路由及相关 Agent Notes。重点追踪了 .removed 状态从包扫描到快照再到提示判断的路径。
  • 已提供的测试或 CI 结果:PR 正文报告 macOS、Rust Core、分发脚本、翻译及资源复用验证通过;提供的 head 检查状态仍为 queued/in_progress,无法从当前上下文确认完成的远程 CI 结果。
  • 本次未运行测试或脚本,未访问网络,未启动应用。
  • 非阻塞风险与验证缺口:没有提供 UI 截图;真实发布者签名包、真实市场索引、Intel 真机及 Windows 独立分发尚未验证。

@xiaoyumuxi
xiaoyumuxi merged commit f582bf3 into 1lck:preview Oct 28, 2026
24 checks passed
xiaoyumuxi added a commit that referenced this pull request Oct 28, 2026
* feat(plugins): execute native build tasks in workspace providers (#1495)

* feat(plugins): discover and execute native provider tests (#1495)

* feat(plugins): prepare and persist provider application runs (#1495)

* feat(plugins): prepare native provider debug sessions (#1495)

* feat(plugins): share read-only provider model inputs (#1495)

* fix(build): isolate producer revisions and own run saves

* feat(plugins): Java Support 独立分发、迁移与按需安装 (#1483)

* feat(plugins): 支持 Java 签名安装与双架构独立发布基础

* feat(plugins): 完成 Java Support 迁移与按需分发入口

* fix(plugins): suggest Java restoration after completed removal

* docs(plugins): inventory Maven and Java migration for #1495 (#1513)

* fix(run): 统一跨平台启动环境、容错扫描与构建事件过滤 (#1543)

* fix(run): share launch environment and resilient workspace policies

* fix(run): stop shared Java enumeration at its source limit

* docs(plugins): plan macOS public APIs and SDK documentation (#1548)

---------

Co-authored-by: Lichenkang <2188718831@qq.com>
Co-authored-by: Xiaoyumuxi <23722032@bjtu.edu.cn>
1lck added a commit that referenced this pull request Oct 29, 2026
* feat(debug): #1210 tcpLanguageServer 调试传输:调试适配器随插件语言服务器运行(Java 迁入插件的第一步) (#1520)

* feat(debug): #1210 tcpLanguageServer 调试传输:调试适配器随插件语言服务器运行(Java 迁入插件的第一步)

debugAdapters 新增 tcpLanguageServer 传输,用于调试服务寄居在同一插件语言服务器里的适配器(Java Debug Server 之于 JDT LS)。该传输没有 launch.process,endpoint 只有 {languageID, command}:languageID 必须是同一插件 languageServers[] 里声明过的,command 限 [A-Za-z0-9._:-]{1,128}。宿主不拉起进程,而是启动该插件的语言服务器,用 workspace/executeCommand 执行 command,把返回值解析成 1…65535 的端口后连接 127.0.0.1。

Rust Core:DebugLaunch.process 改为可选(其他传输仍必填),新增 DebugTransport::TcpLanguageServer 与 DebugEndpoint 校验;programs() 产出 languageServerDebugAdapter,命令变化需要重新批准;debug_adapter_launch_plan 对无进程适配器返回插件语言服务器的启动计划和 debugAdapter 描述符。

macOS:DebugAdapterProcess 换成 DebugAdapterLaunch(host 为 .process 或 .languageServer);MacJavaDebugAdapterTransport 改名 MacHostedPortDebugAdapterTransport,端口来源由宿主注入,不再知道 Java;LanguageToolingSessionManager 新增 startHostedDebugAdapter,校验语言服务器确由该插件拥有,内置 Java 语言服务被拒绝;端口解析抽成 debugAdapterPort(from:)。tcpPort、tcpAnnounced、attach 和 runSelectedRuntime 仍被拒绝,拒绝文案改为只支持 stdio 与语言服务器承载的适配器。

契约与文档:plugin-manifest.schema.json、契约 README、rust-core-api.md、声明草案和 #1210 Agent Note 同步,新增 debug-adapter-language-server 契约 fixture;功能矩阵补充证据与验证说明。i18n:3 条 Java 专属文案改为通用文案,新增 3 条,调整传输拒绝文案,并重新生成产物。

测试:Rust 新增 3 个 Core 测试;Swift 新增解析器、传输、端口解析(16 个用例)与语言服务器归属测试。

* fix(debug): activate hosted language servers and cancel stale adapter starts

* fix(ci): respect runtime boundaries and stabilize native regression tests

* Merge pull request #1534 from 1lck/codex/remove-bot-pr-workflow

chore(ci): remove unused GitHub App Bot PR workflow

* feat(debug): #1210 远程 attach 契约与普通 TCP 生命周期边界 (#1525)

* feat(debug): #1210 tcpLanguageServer 调试传输:调试适配器随插件语言服务器运行(Java 迁入插件的第一步)

debugAdapters 新增 tcpLanguageServer 传输,用于调试服务寄居在同一插件语言服务器里的适配器(Java Debug Server 之于 JDT LS)。该传输没有 launch.process,endpoint 只有 {languageID, command}:languageID 必须是同一插件 languageServers[] 里声明过的,command 限 [A-Za-z0-9._:-]{1,128}。宿主不拉起进程,而是启动该插件的语言服务器,用 workspace/executeCommand 执行 command,把返回值解析成 1…65535 的端口后连接 127.0.0.1。

Rust Core:DebugLaunch.process 改为可选(其他传输仍必填),新增 DebugTransport::TcpLanguageServer 与 DebugEndpoint 校验;programs() 产出 languageServerDebugAdapter,命令变化需要重新批准;debug_adapter_launch_plan 对无进程适配器返回插件语言服务器的启动计划和 debugAdapter 描述符。

macOS:DebugAdapterProcess 换成 DebugAdapterLaunch(host 为 .process 或 .languageServer);MacJavaDebugAdapterTransport 改名 MacHostedPortDebugAdapterTransport,端口来源由宿主注入,不再知道 Java;LanguageToolingSessionManager 新增 startHostedDebugAdapter,校验语言服务器确由该插件拥有,内置 Java 语言服务被拒绝;端口解析抽成 debugAdapterPort(from:)。tcpPort、tcpAnnounced、attach 和 runSelectedRuntime 仍被拒绝,拒绝文案改为只支持 stdio 与语言服务器承载的适配器。

契约与文档:plugin-manifest.schema.json、契约 README、rust-core-api.md、声明草案和 #1210 Agent Note 同步,新增 debug-adapter-language-server 契约 fixture;功能矩阵补充证据与验证说明。i18n:3 条 Java 专属文案改为通用文案,新增 3 条,调整传输拒绝文案,并重新生成产物。

测试:Rust 新增 3 个 Core 测试;Swift 新增解析器、传输、端口解析(16 个用例)与语言服务器归属测试。

* feat(debug): #1210 远程 attach 契约:attach 配置声明 connection 绑定,适配器在远端的设计 Note

- attach 配置的 targetBindings 新增 connection:host+port 或 address,目的地是适配器参数里的点分路径(最多 4 段),可选 pathMappings(objects/first 两种形状)
- 声明期拒绝目的地冲突(与其他目的地、processId/cwd 参数或默认 arguments 重名/包含),运行期 set_argument 只写空位
- debug.adapters.startArguments 支持 connection 目标,校验主机/端口/映射,返回 connection:{host,port,remote};回环只按字面量判断,其余一律 remote:true
- 适配器没有路径映射绑定而目标带了映射时拒绝,而不是悄悄丢弃
- plan 描述符新增 remoteAttach:{pathMappings},宿主据此决定界面,不按适配器名字判断
- 不新增权限,debug.attach 已覆盖;契约 README、schema、rust-core-api、fixture(含 22 条新拒绝用例)、功能矩阵同步
- 新增 Agent Note:适配器运行在远端——经 SSH 的 stdio 调试(仅设计,待确认四项默认选择后再实现),并更新统一调试 Note

* feat(debug): #1210 远程 attach 兼容性审计:路径映射补 dictionary / pairs 两种形状,缺口清单与路线图

按各调试器上游文档核对“附加到远端程序”的参数写法后,路径映射就四种写法:
- objects:对象列表(debugpy pathMappings、delve substitutePath)
- first:唯一一条映射写成两个字符串(js-debug localRoot/remoteRoot)
- dictionary:以 local 或 remote 一侧为键的对象(CodeLLDB sourceMap、PHP pathMappings)
- pairs:二元数组列表,order 为 remoteLocal 或 localRemote(lldb-dap sourceMap)

形状装不下用户给的映射就拒绝,不截断:first 只接受一条(此前只取第一条,与
“不悄悄丢映射”的原则矛盾,属于未发布 API 4 内的行为修正),dictionary 在键的
一侧不能出现同一个根两次,违反返回 debug.target.invalid(target.pathMappings)。
plan.debugAdapter.remoteAttach 增加 maxPathMappings,宿主据此决定最多显示几行。

契约与 fixture:schema 增加两个 oneOf 分支;remote-attach fixture 增加 keyed、
paired 两个适配器(共 6 个);拒绝用例新增 6 条(共 28 条)。

Note:#1210 统一 Note 新增“兼容性审计”,逐个适配器标注“已核对 / 待核验”,列出
G1–G11 缺口(空闲端口占位符、tcpConnect、监听 attach、URI 目标、命令模板等)的
现状、决定和触发条件,并更新后续路线;SSH Note 说明适配器原生映射与 Core 路径翻译
是叠加的两层,远端适配器必须由 Core 翻译。

* docs(debug): separate network paths from TCP lifecycle scope

* feat(debug): #1210 内置汇编级调试:反汇编、指令步进、指令断点、寄存器与只读内存 (#1527)

* feat(debug): #1210 内置汇编级调试:反汇编、指令步进、指令断点、寄存器与只读内存

内核按适配器能力开放汇编级调试,插件只负责启动 lldb-dap/gdb 等适配器;能力快照 supported = 适配器声明 ∧ 已注册扩展 ∧ 已授权。

- 无源码栈帧:栈帧不伪造文件和第 1 行,显示函数名与地址,暂停后自动打开反汇编

- 反汇编:debug.inspect disassemble 与反汇编视图,高亮当前指令,保持最小滚动,剩余不足时向后续读

- 指令步进:debug.execute 增加 granularity,仅适配器声明 supportsSteppingGranularity 时生效;反汇编打开时步过/步入按指令前进,面板头部与按钮提示同步变化,不支持时提示仍按源码行前进

- 指令断点:debug.setInstructionBreakpoints,点击地址栏设置或移除;只属于当前会话,不持久化、不重放

- 寄存器:作用域 presentationHint registers 显示为寄存器标签;宿主不内置 CPU 寄存器表

- 内存:debug.inspect readMemory,接受地址或保存着地址的表达式,从目标前 64 字节读起并分页;目标字节在十六进制和 ASCII 两侧高亮并滚入可见区;右侧显示设置可切换进制、每格字节数、每行字节数、字节序与 ASCII 列;读不到的字节显示为缺失;只读,不开放 writeMemory

- 单步局部刷新:next/stepIn/stepOut/stepBack 保留现有检查数据并原地替换,线程、调用栈、变量、反汇编、内存与 JSON 视图不再整面板清空,变化的内存字节被标出;继续、暂停、结束才清空

- 变量 JSON 视图:修复顶部空白带,key/value 分色高亮

- i18n:新增词条走 shared/i18n 并生成;功能矩阵新增 debug-disassembly(Windows 待实现);设计笔记补充真实 lldb-dap 验证结论

* fix(debug): #1210 guard retained inspection across steps and cancellation

Freeze the old variable tree before the next stop reloads scopes and keep inspection controls read-only until replacement. Retire disassembly and memory callbacks before synchronous cancellation, and reject stale disassembly retries after session changes. Clear retained inspection when transport fails or the session terminates.

Label memory offsets relative to the requested reference, use shared text-input and font owners, and update the owning decision note and platform verification steps.

Add four deterministic regressions reproduced against the original PR. Validation: 152 selected Swift tests and 72 Rust debug tests passed; i18n, shared contracts, platform boundaries, test stability, Agent Notes, matrix gates and runtime bundle immutability passed. Real GUI and Windows runtime validation remain pending.

* feat(debug): #1210 实现普通 TCP 调试连接与有界生命周期 (#1538)

* feat(debug): #1210 implement direct TCP adapter lifecycle

Unify hosted and external DAP byte streams behind a replaceable connection provider; reserve the seam for future network routes without adding proxy or tunnel behavior.

Add explicit endpoint validation, per-connection remote consent, a one-shot launch/attach entry, bounded startup/write buffering, generation-fenced callbacks, and bounded disconnect draining. Keep the debuggee target separate and external resources user-owned.

Cover routing, cancellation, queue limits, cleanup and real loopback Core DAP initialize/attach/disconnect. Update shared fixtures, localization, architecture notes and the platform capability matrix. Windows host and real debugger acceptance remain out of scope.

* fix(debug): #1210 修复 TCP 调试连接评审问题

- 被拒绝或不可达的端口立即以系统原因失败,不再停在 .waiting 等满超时
- 端点发现与建连各自独立计时:发现 120 秒(语言服务器冷启动),建连 10 秒
- 外部适配器会话初始化期限改为 10 秒建连加 10 秒握手,不再抢在建连之前结束
- 连接对话框在连接启动前保持打开,失败原因留在对话框内并保留已填内容
- connectExternalDebugAdapter 返回失败原因,不再静默丢弃请求
- 当前文件没有调试提供方时,"连接调试适配器…"菜单项不可用;主机名先去除首尾空白
- 删除宿主端口传输中无人使用的错误分支
- 补充发现/建连两段期限与真实回环拒绝连接的测试,同步 Agent Note 与功能矩阵

* refactor(debug): #1210 将 TCP 调试连接生命周期下沉到 Rust Core

连接状态转换、取消规则、代次令牌与过期结果拒绝、只结束一次、
建连/写入/排空期限、待发字节与消息预算、单个在途写入,原先都写在
macOS 的 MacTCPDebugAdapterTransport 里,Windows 接入要重写并重新
证明同一套规则。现在这些规则由 Core 的独立状态机持有,平台只做 I/O。

Core(rust/lithe-core/src/debug/transport_lifecycle.rs)
- 与 DAP 协议状态机独立,按 transportId 登记。
- 新增命令 debug.transport.policy / handle / release:平台发送事件,
  Core 返回新代次、阶段、结果和有序效果(发现端点、设置或取消计时器、
  连接、写入、投递数据、关闭、报告失败、通知终止)。
- Core 没有时钟,只决定期限长短和到期后的转换;待发数据只以字节数
  越过 JSON 边界,真实字节、socket 与计时器句柄留在平台。
- 共享 fixture shared/fixtures/debug/transport-lifecycle-v1.json 覆盖
  约 28 个场景,Rust 逐步回放;已登记到 v1-baseline。

macOS
- 新增 RustDebugTransportCore.swift 类型化桥接。
- MacTCPDebugAdapterTransport 只拥有 NWConnection、端点发现任务、待发帧
  字节和系统计时器,并执行 Core 返回的效果;core 参数贯穿托管端口、
  插件和外部端点三条传输,会话初始化期限改读 Core 策略。
- 计时器触发后也释放句柄,避免排空计时器继续持有传输。
- Core 调用本身失败时本地静默拆除并向所有者报告一次。

已接受的行为差异:观察者在错误输出回调里调用 stop() 时,终止通知
现在仍会送达(旧实现把它当作生命周期被替换而吞掉);重启仍会使旧
通知作废。

文档:更新 Agent Note、功能矩阵与 rust-core-api 契约。

* feat(plugins): Java Support 独立分发、迁移与按需安装 (#1483)

* feat(plugins): 支持 Java 签名安装与双架构独立发布基础

* feat(plugins): 完成 Java Support 迁移与按需分发入口

* fix(plugins): suggest Java restoration after completed removal

* docs(plugins): inventory Maven and Java migration for #1495 (#1513)

* fix(run): 统一跨平台启动环境、容错扫描与构建事件过滤 (#1543)

* fix(run): share launch environment and resilient workspace policies

* fix(run): stop shared Java enumeration at its source limit

* docs(plugins): plan macOS public APIs and SDK documentation (#1548)

* feat(plugins): #1495 原生 Provider 工作流与只读工程模型共享 (#1517)

* feat(plugins): execute native build tasks in workspace providers (#1495)

* feat(plugins): discover and execute native provider tests (#1495)

* feat(plugins): prepare and persist provider application runs (#1495)

* feat(plugins): prepare native provider debug sessions (#1495)

* feat(plugins): share read-only provider model inputs (#1495)

* fix(build): isolate producer revisions and own run saves

* feat(plugins): Java Support 独立分发、迁移与按需安装 (#1483)

* feat(plugins): 支持 Java 签名安装与双架构独立发布基础

* feat(plugins): 完成 Java Support 迁移与按需分发入口

* fix(plugins): suggest Java restoration after completed removal

* docs(plugins): inventory Maven and Java migration for #1495 (#1513)

* fix(run): 统一跨平台启动环境、容错扫描与构建事件过滤 (#1543)

* fix(run): share launch environment and resilient workspace policies

* fix(run): stop shared Java enumeration at its source limit

* docs(plugins): plan macOS public APIs and SDK documentation (#1548)

---------

Co-authored-by: Lichenkang <2188718831@qq.com>
Co-authored-by: Xiaoyumuxi <23722032@bjtu.edu.cn>

* fix(macos): 修复 Java 启动竞态、插件启动参数与无限重试 (#1526)

* fix(macos): stabilize Java startup and plugin launch (#1523, #1524)

* test(macos): bound language startup regression task waits

* test(macos): allow disk image creation margin within integration budget

* fix(macos): revoke deferred language activation when project session closes

* test(macos): cover production language launch and navigation evidence

* fix(ide-host): include ttlMs and cacheScope in MCP tools/list (#1545) (#1546)

The helper advertises protocol revision 2026-07-28 through server/discover.
For that revision ListToolsResult extends CacheableResult, where ttlMs and
cacheScope are required, but building the result with ..Default::default()
left both fields absent. Clients validating the negotiated wire shape
rejected the whole server with INVALID_RESULT (ZCode 0.17.0, Qoder).

The catalog describes live IDE state, so the result is immediately stale
(ttlMs 0) and private to the connected client.

Co-authored-by: jiaqizhang258 <321343564+jiaqizhang258@users.noreply.github.com>
Co-authored-by: Lichenkang <2188718831@qq.com>

* fix(mcp): 稳定 Windows 请求调度与授权生命周期 (#1549)

* fix(mcp): stabilize Windows request delivery and protocol discovery

* fix(mcp): recover independent notifications and enforce monotonic deadlines

* fix(macos): 独立多 Diff 标签与连续滚动、工作树管理体验 (#1555)

* fix(macos): support independent diff tabs and continuous Git browsing

- isolate diff sessions, editor groups, focus, navigation and async reads
- auto-load disassembly, Git/worktree history, VCS and MCP discovery lists
- preserve scroll anchors and suppress background Git command noise
- add worktree change management and shared localized actions
- organize develop-lithe guidance in Chinese and update capability records
- repair per-toolchain SwiftPM resource caches and add regression coverage
- align affected macOS code with the pinned Swift 6.3.3 compiler

Refs #1210

* fix(macos): 工作树更改页即时暂存、工具栏精简与 Git 控制台取消过滤

工作树「更改」页
- 勾选复选框后立即显示目标暂存状态(乐观显示),Git 完成后以实际结果为准;
  仅等待本工作树状态扫描完成即恢复可点击,不再被全项目刷新阻塞。
- 工具栏只保留有实际动作的按钮:刷新、暂存全部、丢弃所选、显示 Diff;
  移除灰显无作用的占位按钮,启用条件与选区/可暂存项一致。
- 提交历史页脚在加载中/失败/空闲都有固定行高内容,不再留空白带。
- 概览动作改为自然宽度的单一换行流,宽窗口详情自适应两列。

Git 控制台
- 在任何命令启动前就被取消(被后续请求取代)的请求不再显示为失败行;
  已启动命令的取消仍保留并标注原因。同步更新共享契约、fixture 与 Windows journal。

其他
- Git Log 筛选弹窗/图/Diff 的布局与滚动细节调整,补充对应测试与中英词条。
- 同步 git-worktrees 平台能力记录。

* fix(macos): 修复多 Diff 标签刷新、历史重试、反汇编宽度与保存更改比较的评审问题

- 状态刷新只在本次真正读取过状态的仓库内才把"缺席"当作文件已干净;链接工作树的标签不再被
  工作区刷新误关,由该工作树自己的状态读取(refreshWorktreeChanges)决定是否关闭
- 工作区/目录比较刷新内容未变时不再给会话的 @published 属性赋值(不重绘、不丢滚动位置);
  新增 GitRepositoryDiffSession.updateDocument,同时比较补丁与行(与 HEAD 的比较没有补丁文本)
- 目录比较刷新改为就地更新(showDirectoryDiff 增加 refreshingConfirmedRoots),不再清空行并闪现加载态
- 提交历史加载失败后的显式重试按已加载条数重新打开窗口,不缩回首页、不移动选择
- 反汇编列表只对最长候选行做文字测量,不再每次 body 求值都测量全部行
- 保存更改比较恢复"快照属于当前仓库"的校验,并在打开标签前校验版本与文件,避免留下空标签
- 补充回归测试,并更新两份 Agent Note

* fix(remote): #1507 远程工作区、构建与插件执行适配 (#1515)

* fix(remote): adapt workspace I/O and plugin execution for #1507

* fix(remote): continue #1507 common backend lifecycle and plugin validation

Integrate PR #1515 onto the preview baseline, preserving plugin live activation and shared i18n changes. Reserve pending process, terminal and watch starts before dispatch; retain cleanup ownership across cancellation, worker saturation, disconnect and session shutdown.

Add deterministic lifecycle and declarative remote launch regressions; isolate the empty connection registry test, fix Swift fixture shadowing and synchronize terminal resize with shell readiness. Update contracts, Agent Notes and partial/pending capability evidence. Java/JDT integration remains out of scope.

* fix(remote): own plugin snapshots and isolate upload I/O

Add session-owned run directory allocation and cleanup with retryable errors, original-session macOS deployment cleanup, and per-upload I/O isolation.

Cover lifecycle and upload ordering regressions, update contracts/resource boundaries and capability evidence, and record optional transfer/environment candidates without expanding Agent or Java scope.

* fix(remote): preserve repository identity and consolidate remote crate

Keep remote Git repository roots and external metadata bound to their original host, including parent repositories and symlink roots.

Consolidate client, protocol and server into lithe-remote with isolated client/server features, preserving the standalone server binary. Update consumers, packaging, CI selection, resource validation, contracts and regression coverage.

* fix(remote): 修复合并后的 Agent Notes 路径,补齐能力矩阵并收紧远程扫描失败判定

- 两条 proposed 笔记的适用范围仍指向已合并的 rust/lithe-remote-client,
  改为 rust/lithe-remote/src/client/,修复 Verify Agent Notes。
- 能力矩阵:remote-development-workspace 增加 BuildSystemService 与共享扫描证据,
  写明运行配置发现尚未接入远程(Core 对 runConfig.inspect 返回 NotSupported,
  仅 runConfig.selectJava 可用);run-discovery 增加同一说明。状态不变。
- 远程共享运行扫描只在链路取消、超时或中断时整体失败;主机对单个目录报告的
  错误仍记为扫描不完整,与本机一致。判断集中到 workspace_io::is_transport_failure,
  detectors/scan.rs 与 workspace_scan.rs 共用,修正此前两处不一致。
- 新增集成测试:读取主机目录树且占位目录保持为空、单目录错误记为不完整、
  根目录之下链路中断时扫描失败。

* fix(macos): avoid reentrant workbench hit testing (#1542) (#1557)

* chore(scripts): 按作用语义整理 scripts 目录层级 (#1563)

* chore(scripts): 按作用语义整理 scripts 目录层级

把 scripts/ 根目录下 127 个平铺脚本移入分类子目录,根目录不再放任何脚本。
全部使用 git mv,历史可追溯。

新目录:
- ci/{common,cancel-closed-pr-runs,update-repo-charts}:CI 脚本,按工作流名分目录
- macos/{build,package,prepare,test,verify,perf,probe}
- windows/{build,prepare,package,test,verify}
- release/{sparkle,macos,autobuild,windows,notes}
- rust-core、architecture、i18n、agent-notes、platform-feature-matrix、
  plugins、remote、ide-mcp、editor、git-graph、agent、resources

同步修改:
- classify-ci-changes.sh 路径模式、plan-ci-lane-reuse.mjs 基础设施规则、
  对应测试夹具(夹具复制脚本时按新目录深度建目录)
- ci-macos.yml 的 scripts/**/*.sh 循环、verify-i18n.yml 等工作流路径与 paths 过滤
- sparkle 的三个 Ruby 脚本改为 require_relative "../autobuild/autobuild-identity"
- tauri.conf.json 的 beforeDevCommand / beforeBuildCommand
- README、docs、Agent 笔记、Skill 和 Fonts NOTICE 中的脚本路径
- develop-lithe Skill 新增“脚本放置与分类”一节,AGENTS.md 增加入口提醒:
  脚本必须在 scripts/ 下按作用分类,不得放在 scripts/ 根目录

验证:
- 127 个脚本在旧分类器/新分类器下的 lane 结果一致,未知路径仍然 fail closed
- 127 个脚本的规划器基础设施规则一致
- 受影响的 node/bun/shell/ruby/python 测试与 i18n、特性矩阵、Agent 笔记、
  共享契约、模块/服务/编辑器边界、运行时 bundle 只读校验均通过

* fix(scripts): 修复 scripts 分类整理的评审问题

- Windows 前端安装测试移到 scripts/windows/build/,与被测脚本同目录,
  测试夹具里复制脚本的路径、ci-windows.yml 的运行命令、分类器 windows 分支
  和 Agent Note 里的路径同步更新
- 分类器空分支删除 3 个已不存在的平铺脚本名,避免过期名字被误当成已登记
- 规划器的 Windows 规则改为按目录匹配(windows/、release/windows/),
  并单独登记 ide-mcp/build-windows-ide-mcp.mjs,补齐测试期望,
  与分类器的路由保持一致
- develop-lithe Skill 补充:平台专属脚本留在所属跨平台领域目录的例外、
  手工验收脚本放 test/、tauri.conf.json / package.json / official-plugins.json
  inputPaths / worktree-resources.json 里硬编码脚本路径的检查清单

* fix(windows): 补全 JavaSelectionRequest.requirements,修复 Windows 安装包构建 (#1507) (#1565)

#1515 给 lithe-core 的 JavaSelectionRequest 新增了必填字段 requirements,
但 Windows 的 select_project_java 仍按旧字段构造,导致 Release AutoBuild
的 Windows 安装包步骤报 E0063 编译失败。

- windows/tauri/src-tauri/src/run.rs:Windows 传 root,requirements 与 root
  互斥,所以填 None
- develop-lithe Skill:补充 lithe-core 公开 Rust 类型/签名也是兼容面,
  Windows 直接链接 Core,改动时要同步检查调用点并给出检查方法

* docs: refresh WeChat community QR code (#1569)

---------

Co-authored-by: Xiaoyumuxi <23722032@bjtu.edu.cn>
Co-authored-by: muchen <145200703+Mucheen@users.noreply.github.com>
Co-authored-by: arkleselect <166632698+arkleselect@users.noreply.github.com>
Co-authored-by: jiaqizhang258 <549728022@qq.com>
Co-authored-by: jiaqizhang258 <321343564+jiaqizhang258@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

review: medium ghfind author score; see https://ghfind.com

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants